/*
Cassia: Catalogador SIB sobre Informaci�n Ambiental-
Copyright (C) 2010 Benjamin Rodriguez <benjamin.a.rodriguez@gmail.com>

Este programa es software libre: usted puede redistribuirlo y/o modificarlo 
bajo los t�rminos de la Licencia P�blica General GNU publicada 
por la Fundaci�n para el Software Libre, ya sea la versi�n 3 
de la Licencia, o (a su elecci�n) cualquier versi�n posterior.

Este programa se distribuye con la esperanza de que sea �til, pero 
SIN GARANT�A ALGUNA; ni siquiera la garant�a impl�cita 
MERCANTIL o de APTITUD PARA UN PROP�SITO DETERMINADO. 
Consulte los detalles de la Licencia P�blica General GNU para obtener 
una informaci�n m�s detallada. 

Deber�a haber recibido una copia de la Licencia P�blica General GNU 
junto a este programa. 

En caso contrario, consulte <http://www.gnu.org/licenses/>.

 */
package org.humboldt.cassia.core.utils;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import org.humboldt.cassia.core.Constantes;
import org.humboldt.cassia.core.jdo.AtributosPerfil;
import org.humboldt.cassia.core.jdo.Conjunto;
import org.humboldt.cassia.core.jdo.PerfilDocumentacion;
import org.humboldt.cassia.core.jdo.ValorAtributo;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * Clase usada para exportar la informaci�n de un conjunto en XML
 * @author Benjamin A. Rodriguez R. benjamin.a.rodriguez@gmail.com
 *
 */
public class ExportarConjunto {

    /**
     * Genera el XML de un conjunto
     * @param conjunto
     * @param perfil
     * @return
     */ 
    public String exportarConjunto(Conjunto conjunto, PerfilDocumentacion perfil, String rutaXSD) {
        
    	 StringBuffer xmlConjunto = new StringBuffer();
         HashMap namespaces = new HashMap();
         String xml = "";
         if (conjunto.getValoresAtributo().size() != 0) {
	         ValorAtributo valor = conjunto.getValoresAtributo().iterator().next();
	         String atributo = perfil.getAtributoById(valor.getAtributo()).getNombre();
	
	         Namespace xsiNS = Namespace.getNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
	
	         Element elemento = new Element(atributo);
	         obtenerXMLConjunto(namespaces, elemento, valor.getHijos(), perfil);
	
	         elemento.addNamespaceDeclaration(xsiNS);

	         if (rutaXSD != null)
	        	 elemento.setAttribute(new Attribute("noNamespaceSchemaLocation",rutaXSD, xsiNS));
	         
	//       for(Object namespaceObj:namespaces.keySet()){
	//               String namespace = (String)namespaceObj;
	//               int equalsIndex = namespace.indexOf("=");
	//               String base = namespace.substring("xmlns:".length(), equalsIndex);
	//               elemento.setAttribute(base + ":schemaLocation", "http://xml.org/ " + rutaXSDNamespace);
	//       }
	         Document doc = new Document(elemento);
	         Format format = Format.getPrettyFormat();
	         format.setEncoding("ISO-8859-1");
	         XMLOutputter outputter = new XMLOutputter();
	         outputter.setFormat(format);
	         StringWriter writer = new StringWriter();
	         
	         try {
	                 outputter.output(doc, writer);
	                 xml = writer.toString();
	                 xml = xml.replaceAll("&", "&amp;");
	                 Iterator itNamespace = namespaces.keySet().iterator();
	                 while (itNamespace.hasNext()) {
	                         String namespace = (String) itNamespace.next();
	                         xml = xml.replaceAll(" " + namespace, "");
	                 }
	         } catch (IOException e) {
	                 e.printStackTrace();
	         }
         }
         return xml;
         
    }

    private void obtenerXMLConjunto(HashMap namespaces, Element elemento, Collection<ValorAtributo> valorAtributos, PerfilDocumentacion perfil) {
        if (valorAtributos == null) {
            return;
        }
        for (ValorAtributo valorAtributo : valorAtributos) {
            AtributosPerfil atributoPerfil = perfil.getAtributoById(valorAtributo.getAtributo());
            String atributo = atributoPerfil.getNombre();
            Namespace namespace = null;
            if (atributo.indexOf(":") >= 0) {
                namespace = Namespace.getNamespace(atributo.substring(0, atributo.indexOf(":")), "http://xml.org/");
                namespaces.put("xmlns:" + atributo.substring(0, atributo.indexOf(":")) + "=\"http://xml.org/\"", Boolean.TRUE);
                atributo = atributo.substring(atributo.indexOf(":") + 1);
            }
            if (Constantes.ATRIBUTO_ATRIBUTO == atributoPerfil.getElemento()) {
                Attribute attribute = new Attribute(atributo, valorAtributo.getValor());
                elemento.setAttribute(attribute);
            } else {
                Element elementoHijo = new Element(atributo);
                elementoHijo.addContent(valorAtributo.getValor());
                obtenerXMLConjunto(namespaces, elementoHijo, valorAtributo.getHijos(), perfil);
                elemento.addContent(elementoHijo);
            }
        }
    }
}
